<?php
/**
 * util file
 * @package common_lib_util
 */
/**
 * util file
 * @author pandajingjing
 * @package common_lib_util
 */
class util_file{

    /**
	 * Mime定义
	 * @var array
	 */
    private static $_arrMimeType=array( 
            'application/msword'=>'doc',
            'application/octet-stream'=>'',
            'application/pdf'=>'pdf',
            'application/vnd.ms-excel'=>'xls',
            'application/vnd.ms-publisher'=>'pub',
            'application/vnd.ms-powerpoint'=>'pptx',
            'application/vnd.openxmlformats-officedocument.wordprocessingml.document'=>'docx',
            'application/vnd.rn-realmedia'=>'rmvb',
            'application/x-msdownload'=>'exe',
            'image/bmp'=>'bmp',
            'image/gif'=>'gif',
            'image/jpeg'=>'jpg',
            'image/png'=>'png',
            'text/plain'=>'txt',
            'text/xml'=>'xml' 
    );

    /**
	 * 根据mimetype返回后缀名
	 * @param string $p_strMimeType
	 * @return string
	 */
    static function getExtension($p_strMimeType){
        if(''==$p_strMimeType){
            return 'dat';
        }else{
            if(isset(self::$_arrMimeType[$p_strMimeType])){
                return self::$_arrMimeType[$p_strMimeType];
            }else{
                return 'dat';
            }
        }
    }

    /**
	 * 根据后缀名返回mimetype
	 * @param string $p_strExtension
	 * @return string
	 */
    static function getMimeType($p_strExtension){
        if(''==$p_strExtension){

        }else{
            foreach(self::$_arrMimeType as $strMime=>$strExtension){
                if($p_strExtension==$strExtension){
                    return $strMime;
                }
            }
        }
    }

    /**
	 * 尝试读取文件内容
	 * @param string $p_strFilePath
	 * @param int $p_intTryTime
	 * @return string/false
	 */
    static function tryReadFile($p_strFilePath,$p_intTryTime=5){
        $strContent='';
        for($i=0;$i<$p_intTryTime;++$i){
            $strContent=file_get_contents($p_strFilePath);
            if(false!==$strContent){
                return $strContent;
            }
        }
        return false;
    }

    /**
	 * 尝试写文件内容
	 * @param string $p_strFilePath
	 * @param string $p_strContent
	 * @param int $p_intTryTime
	 * @return true/false
	 */
    static function tryWriteFile($p_strFilePath,$p_strContent,$p_intFlag=NULL,$p_intTryTime=5){
        for($i=0;$i<$p_intTryTime;++$i){
            $bolResult=file_put_contents($p_strFilePath,$p_strContent,$p_intFlag);
            if(false!==$bolResult){
                return true;
            }
        }
        return false;
    }

    /**
	 * 尝试删除文件
	 * @param string $p_strFilePath
	 * @param int $p_intTryTime
	 * @return true/false
	 */
    static function tryDeleteFile($p_strFilePath,$p_intTryTime=5){
        for($i=0;$i<$p_intTryTime;++$i){
            $bolResult=@unlink($p_strFilePath);
            if(false!==$bolResult){
                return true;
            }
        }
        return false;
    }

    /**
	 * 尝试创建目录
	 * @param string $p_strDir
	 * @param int $p_intMode
	 * @param boolean $p_bolRecursive
	 * @param int $p_intTryTime
	 * @return true/false
	 */
    static function tryMakeDir($p_strDir,$p_intMode=NULL,$p_bolRecursive=NULL,$p_intTryTime=5){
        for($i=0;$i<$p_intTryTime;++$i){
            $bolResult=@mkdir($p_strDir,$p_intMode,$p_bolRecursive);
            if(false!==$bolResult){
                return true;
            }
        }
        return false;
    }

    /**
	 * 尝试复制文件
	 * @param string $p_strSourceFilePath
	 * @param string $p_strDestSourceFilePath
	 * @param boolean $p_bolOverWritten
	 * @param int $p_intTryTime
	 * @return true/false
	 */
    static function tryCopyFile($p_strSourceFilePath,$p_strDestSourceFilePath,$p_bolOverWritten=false,$p_intTryTime=5){
        if(!$p_bolOverWritten){
            if(file_exists($p_strDestSourceFilePath)){
                return false;
            }
        }
        for($i=0;$i<$p_intTryTime;++$i){
            $bolResult=@copy($p_strSourceFilePath,$p_strDestSourceFilePath);
            if(false!==$bolResult){
                return true;
            }
        }
        return false;
    }

    /**
	 * 尝试移动文件
	 * @param string $p_strSourceFilePath
	 * @param string $p_strDestSourceFilePath
	 * @param boolean $p_bolOverWritten
	 * @param int $p_intTryTime
	 * @return true/false
	 */
    static function tryMoveFile($p_strSourceFilePath,$p_strDestSourceFilePath,$p_bolOverWritten=false,$p_intTryTime=5){
        if(!$p_bolOverWritten){
            if(file_exists($p_strDestSourceFilePath)){
                return false;
            }
        }
        for($i=0;$i<$p_intTryTime;++$i){
            $bolResult=@rename($p_strSourceFilePath,$p_strDestSourceFilePath);
            if(false!==$bolResult){
                return true;
            }
        }
        return false;
    }

    /**
	 * 尝试读取目录
	 * @param string $p_strDir
	 * @param boolean $p_bolRecursive
	 * @return array
	 */
    static function tryReadDir($p_strDir,$p_bolRecursive=false){
        if(file_exists($p_strDir)){
            $arrTmp=scandir($p_strDir);
        }else{
            $arrTmp=array();
        }
        $arrResult=array();
        foreach($arrTmp as $strPath){
            if('.'==$strPath or '..'==$strPath){
                continue;
            }
            $strFullPath=$p_strDir.DIRECTORY_SEPARATOR.$strPath;
            if(is_dir($strFullPath)){
                if($p_bolRecursive){
                    $arrSubResult=self::tryReadDir($strFullPath,$p_bolRecursive);
                    $arrResult=array_merge($arrResult,$arrSubResult);
                }else{
                    $arrResult[]=array( 
                            'PATH'=>$strFullPath,
                            'TYPE'=>'Directory' 
                    );
                }
            }elseif(is_file($strFullPath)){
                $arrResult[]=array( 
                        'PATH'=>$strFullPath,
                        'TYPE'=>'File' 
                );
            }elseif(is_link($strFullPath)){
                $arrResult[]=array( 
                        'PATH'=>$strFullPath,
                        'TYPE'=>'Link' 
                );
            }else{
                $arrResult[]=array( 
                        'PATH'=>$strFullPath,
                        'TYPE'=>'Unknown' 
                );
            }
        }
        return $arrResult;
    }

    /**
	 * 格式化输出文件大小
	 * @param int $p_intBytes
	 * @param string $p_strUnit
	 * @param string $p_strType
	 * @return int/string/array
	 */
    static function formatFileSize($p_intBytes,$p_strUnit='auto',$p_strType='string'){
        switch(strtolower($p_strUnit)){
            case 'kb':
                return round($p_intBytes/1024,2);
                break;
            case 'mb':
                return round($p_intBytes/1048576,2);
                break;
            case 'gb':
                return round($p_intBytes/1073741824,2);
                break;
            case 'auto':
            case 'auto-sub-abs':
            case 'auto-sub-dec':
                $arrTmp=array();
                $arrTmp[]=floor($p_intBytes/1073741824);
                $arrTmp[]=floor(($p_intBytes%1073741824)/1048576);
                $arrTmp[]=floor(($p_intBytes%1048576)/1024);
                $arrTmp[]=floor($p_intBytes%1024);
                $arrUnit=array( 
                        'GB',
                        'MB',
                        'KB',
                        'B' 
                );
                if('string'==$p_strType){
                    $intFlag=0;
                    foreach($arrTmp as $intIndex=>$intValue){
                        if($intValue>0){
                            $intFlag=$intIndex;
                            break;
                        }
                    }
                    if('auto-sub-abs'==$p_strUnit or 'auto-sub-dec'==$p_strUnit){
                        $intSubFlag=$intFlag+1;
                        if(isset($arrTmp[$intSubFlag])){
                            if('auto-sub-abs'==$p_strUnit){
                                return $arrTmp[$intFlag].$arrUnit[$intFlag].$arrTmp[$intSubFlag].$arrUnit[$intSubFlag];
                            }else{
                                return ($arrTmp[$intFlag]+round($arrTmp[$intSubFlag]/1024,2)).$arrUnit[$intFlag];
                            }
                        }
                    }
                    return $arrTmp[$intFlag].$arrUnit[$intFlag];
                }else{
                    return $arrTmp;
                }
                break;
        }
        return $p_intBytes;
    }
}